#ifndef P_H
#define P_H

#include <stdint.h>

//以太网帧头部结构
typedef struct 
{
    uint8_t dst_mac[6];//目的MAC地址，6字节
    uint8_t src_mac[6];//源 MAC 地址，6字节
    uint16_t ether_type;//以太网种类
}EthernetHeader;

//IP头部结构
typedef struct {
    uint8_t version_ihl;
    uint8_t tos;
    uint16_t total_length;
    uint16_t identification;
    uint16_t flags_fragment_offset;
    uint8_t ttl;  // 生存时间
    uint8_t protocol;  // 协议类型
    uint16_t header_checksum;  // 首部校验和
    uint32_t src_ip;  // 源 IP 地址
    uint32_t dst_ip;  // 目的 IP 地址
}IPHeader;

//树节点结构
typedef struct TreeNode{
    void (*process)(const uint8_t *,int,struct TreeNode *,void *);
    struct TreeNode *left;
    struct TreeNode *right;
}TreeNode;


// 使用位域定义数据包标志
typedef struct {
    uint16_t is_external : 1;
    uint8_t reserved : 7;
} PacketFlags;

// 流量统计结构体
typedef struct {
    char ips[100][16];
    uint64_t traffic[100];
    int count;
} TrafficStats;

// 初始化流量统计结构体
void init_traffic_stats(TrafficStats *stats);

// 处理数据包
void process_packet(const uint8_t *packet, int len, TrafficStats *stats);

// 构建处理数据包的树结构
TreeNode *build_tree();

// 通过树结构处理数据包
void process_packet_through_tree(TreeNode *root,const uint8_t *packet,int len,TrafficStats *stats);

// 释放树结构占用的内存
void free_tree(TreeNode *root);

#endif
